home *** CD-ROM | disk | FTP | other *** search
/ User's Choice Windows CD / User's Choice Windows CD (CMS Software)(1993).iso / win_u_z / wt_jan92.zip / SHAW.ZIP / DDE.CPP < prev    next >
C/C++ Source or Header  |  1991-11-05  |  4KB  |  190 lines

  1. // dde.h RHS 10/15/91
  2.  
  3. #include<string.h>
  4. #pragma hdrstop
  5. #include"dde.h"
  6.  
  7. BOOL DDE::DDEOK = FALSE;
  8. WORD DDE::conversations = 0;
  9.  
  10. // ********************************** DDE member functions
  11.  
  12. DDE::DDE(FARPROC NewCallBack, DWORD filters)
  13.     {
  14.     char buf[50];
  15.  
  16.     if(!DDEOK)
  17.         instanceID = 0L;
  18.     conversations++;
  19.  
  20.     DDEOK = ( (LOBYTE(GetVersion()) > 2) && (GetWinFlags() & WF_PMODE) ) 
  21.         ? TRUE : FALSE;
  22.  
  23.     CallBack = NULL;
  24.     SetCallBack((FARPROC)NewCallBack);
  25.     SetFilters(filters);
  26.  
  27.     if(!Initialize())
  28.         instanceID = 0L;
  29.     }
  30.  
  31. DDE::~DDE(void)
  32.     {
  33.     if(!instanceID)
  34.         return;
  35.     conversations--;
  36.     if(conversations == 0)
  37.         {
  38.         DdeUninitialize(instanceID);
  39.         instanceID = 0;
  40.         DDEOK = 0;
  41.         }
  42.     FreeProcInstance(CallBack);
  43.     }
  44.  
  45. HSZ DDE::CreateStrHandle(LPSTR str, int codepage)
  46.     {
  47.     if(instanceID)
  48.         return DdeCreateStringHandle(instanceID,str,codepage);
  49.     }
  50. void DDE::DestroyStrHandle(HSZ hsz)
  51.     {
  52.     if(instanceID && hsz)
  53.         DdeFreeStringHandle(instanceID,hsz);
  54.     }
  55.  
  56. BOOL DDE::Initialize(void)
  57.     {
  58.     if(lasterr = DdeInitialize(&instanceID,(PFNCALLBACK)CallBack,filters,0L))
  59.         return result = FALSE;
  60.     return TRUE;
  61.     }
  62.  
  63. void DDE::SetFilters(DWORD newFilters)
  64.     {
  65.     filters = newFilters;
  66.     }
  67.  
  68. WORD DDE::GetLastError(void)
  69.     {
  70.     return lasterr;
  71.     }
  72.  
  73. void DDE::SetCallBack(FARPROC NewCallBack)
  74.     {
  75.     if(CallBack)
  76.         FreeProcInstance(CallBack);
  77.  
  78.     CallBack = MakeProcInstance((FARPROC)NewCallBack,GetInstance());
  79.     }
  80.  
  81. BOOL DDE::GetResult(void)
  82.     {
  83.     return result;
  84.     }
  85.  
  86.  
  87.  
  88. // ****************************** DDEClient member functions
  89.  
  90. DDEClient::DDEClient(char *s, char *t, FARPROC ClientCallBack, DWORD filters)
  91.     : DDE(ClientCallBack,filters)
  92.     {
  93.     if(!DDEOK)
  94.         {
  95.         result = FALSE;
  96.         return;
  97.         }
  98.     strcpy(server = new char[strlen(s)+1], s);
  99.     strcpy(topic = new char[strlen(t)+1],t);
  100.     hServer = CreateStrHandle(server);
  101.     hTopic = CreateStrHandle(topic);
  102.  
  103.     item = NULL;
  104.     hItem = 0;
  105.     data = NULL;
  106.  
  107.     SetTimeOut(1000L);
  108.     }
  109.  
  110. void DDEClient::SetTimeOut(DWORD newtimeout)
  111.     {
  112.     timeout = newtimeout;
  113.     }
  114.  
  115. WORD DDEClient::Request(char *i)
  116.     {
  117.     strcpy(item = new char[strlen(i)+1],i);
  118.     hItem = CreateStrHandle(item);
  119.  
  120.     if(!Connect())
  121.         return FALSE;
  122.  
  123.     if(!MakeRequest())
  124.         return FALSE;
  125.  
  126.     result = TRUE;
  127.     }
  128.  
  129. BOOL DDEClient::Connect(void)
  130.     {
  131.     if((hConv = DdeConnect(instanceID,hServer,hTopic,(LPVOID)NULL)) == NULL)
  132.         return result = FALSE;
  133.     return TRUE;
  134.     }
  135.  
  136. BOOL DDEClient::MakeRequest(void)
  137.     {
  138.     HDDEDATA hData;
  139.  
  140.     if(hData = DdeClientTransaction(NULL,0L,hConv,hItem,CF_TEXT,
  141.         XTYP_REQUEST,timeout,NULL))
  142.         {
  143.         DWORD len;
  144.  
  145.         if(data)
  146.             delete data;
  147.         len = DdeGetData(hData,NULL,len = 0L, 0L);
  148.         data = new char[(int)(len+1)];
  149.         DdeGetData(hData,(LPBYTE)data,len,0L);
  150.         data[(int)len] = '\0';
  151.         DdeFreeDataHandle(hData);
  152.         return TRUE;
  153.         }
  154.     return FALSE;
  155.     }
  156.  
  157. char *DDEClient::GetServer(void)
  158.     {
  159.     return server;
  160.     }
  161.  
  162. char *DDEClient::GetTopic(void)
  163.     {
  164.     return topic;
  165.     }
  166.  
  167. char *DDEClient::GetItem(void)
  168.     {
  169.     return item;
  170.     }
  171.  
  172. DDEClient::~DDEClient(void)
  173.     {
  174.     delete server;
  175.     delete topic;
  176.     delete item;
  177.     delete data;
  178.  
  179.     DdeDisconnect(hConv);
  180.  
  181.     DestroyStrHandle(hServer);
  182.     DestroyStrHandle(hTopic);
  183.     DestroyStrHandle(hItem);
  184.     }
  185.  
  186. char *DDEClient::GetData(void)
  187.     {
  188.     return data;
  189.     }
  190.